package alipay

import (
	"bytes"
	"io"
)

func parseString(i interface{}) string {
	if i == nil {
		return ""
	}
	t, ok := i.(string)
	if !ok {
		return ""
	}
	return t
}

type FileData struct {
	buf  io.Reader
	name string
}

func (f *FileData) File() io.Reader {
	return f.buf
}

func (f *FileData) Name() string {
	return f.name
}

// 新建文件数据对象
func NewFileData(filename string, buf []byte) *FileData {
	if buf == nil {
		return nil
	}
	return &FileData{
		buf:  bytes.NewBuffer(buf),
		name: filename,
	}
}

// 联系人信息
type ContactInfo struct {
	ContactName   string `json:"contact_name"`
	ContactMobile string `json:"contact_mobile"`
	ContactEmail  string `json:"contact_email"`
}

type AgentCreateReq struct {
	Account     string       `json:"account"`
	OrderTicket string       `json:"order_ticket"`
	ContactInfo *ContactInfo `json:"contact_info"`
}

type AgentCreateResp struct {
	BatchNo     string `json:"batch_no"`
	BatchStatus string `json:"batch_status"`
}

type AgentConfirmReq struct {
	// 事务编号
	BatchNo string `json:"batch_no"`
}

type AgentConfirmResp struct {
	UserId          string `json:"user_id"`
	AuthAppId       string `json:"auth_app_id"`
	AppAuthToken    string `json:"app_auth_token"`
	AppRefreshToken string `json:"app_refresh_token"`
	ExpiredIn       string `json:"expired_in"`
	ReExpiredIn     string `json:"re_expired_in"`
}

type AgentCancelReq struct {
	// 事务编号
	BatchNo string `json:"batch_no"`
}

type AgentFaceToFaceSignReq struct {
	BatchNo string `json:"batch_no"`
	MccCode string `json:"mcc_code"`
	// 图片base64编码
	SpecialLicensePic      *FileData `json:"special_license_pic,omitempty"`
	Rate                   string    `json:"rate"`
	SignAndAuth            bool      `json:"sign_and_auth"`
	BusinessLicenseNo      string    `json:"business_license_no"`
	BusinessLicensePic     *FileData `json:"business_license_pic,omitempty"`
	BusinessLicenseAuthPic *FileData `json:"business_license_auth_pic,omitempty"`
	LongTerm               bool      `json:"long_term"`
	DateLimitation         string    `json:"date_limitation"`
	ShopScenePic           *FileData `json:"shop_scene_pic,omitempty"`
	ShopSignBoardPic       *FileData `json:"shop_sign_board_pic,omitempty"`
}

type AgentOrderQueryReq struct {
	// 事务编号
	BatchNo string `json:"batch_no"`
}

type AgentOrderQueryResp struct {
	OrderStatus  string `json:"order_status"`
	ConfirmUrl   string `json:"confirm_url"`
	AgentAppId   string `json:"agent_app_id"`
	RejectReason string `json:"reject_reason"`
	MerchantPid  string `json:"merchant_pid"`
}

// 上传门店照片请求
type MaterialImageUploadReq struct {
	// 授权token
	AppAuthToken string    `json:"app_auth_token"`
	ImageType    string    `json:"image_type"`
	ImageName    string    `json:"image_name"`
	ImageContent *FileData `json:"image_content"`
	ImagePid     string    `json:"image_pid"`
}

// 上传门店照片响应
type MaterialImageUploadResp struct {
	ImageId  string `json:"image_id"`
	ImageUrl string `json:"image_url"`
}

var productCodes = []string{
	"I1140300001000001870", // 商家分账
	"I1140200001000001436", // 资金预授权
	"I1080300001000010588", // 身份验证
	"I1090100001000002136", // 现金红包
	"99030100001000005437", // 小程序内容同步
	"I1080300001000015607", // 小程序订单中心
	"J1010300100000000002", // 花呗分期
	"I1011000100000000001", // 当面付
	"I1012000200000000001", // 转账到支付宝账户
}

type AgentSignStatusQueryReq struct {
	// 授权token
	AppAuthToken string `json:"app_auth_token"`
	// 商户账号
	Pid string `json:"pid"`
	// 产品码
	ProductCodes []string `json:"product_codes"`
}

func hasStr(a []string, b string) bool {
	for _, i := range a {
		if i == b {
			return true
		}
	}
	return false
}

func (a *AgentSignStatusQueryReq) IsValidCodes() bool {
	for _, c := range a.ProductCodes {
		if !hasStr(productCodes, c) {
			return false
		}
	}
	return true
}

type AgentSignStatusInfo struct {
	// 产品名称
	ProductName string `json:"product_name"`
	// 产品编码
	ProductCode string `json:"product_code"`
	// 状态
	Status string `json:"status"`
	// 状态描述
	StatusDesc string `json:"status_desc"`
}

func (a *AgentSignStatusInfo) getStatusDesc() string {
	switch a.Status {
	case "none":
		return "未签约"
	case "valid":
		return "已生效"
	case "restrictValid":
		return "受限生效"
	case "audit":
		return "审核中"
	case "waitConfirm":
		return "待商户确认协议"
	case "auditReject":
		return "审核未通过"
	case "invalid":
		return "合约失效"
	case "restrictInvalid":
		return "受限失效"
	default:
		return ""
	}
}

type AgentSignStatusQueryResp struct {
	// 签约状态结果对象数组
	SignStatusList []*AgentSignStatusInfo `json:"sign_status_list"`
}
